/*
 * Copyright (c) 2019.  drakelee.base All rights reserved.
 */

package com.base.components.task.service;

import com.base.components.feign.clients.TaskManagerBaseClient;
import org.quartz.JobExecutionContext;

import java.util.Map;

/**
 * <p>Description: 调度任务基础类，需继承该类</p>
 *
 * <p>自定义任务处理类并继承该类，然后使用{@link TaskManagerBaseClient }进行任务的发布和持久化。
 *
 * <p>注：调用方法执行中，如果出现异常未进行处理并抛向上一层，
 *        则当前调用作业的服务器会就此作业执行失败，由其它服务器继续执行，
 *        直到全部服务器都依次调用完毕。
 * <p>注：如果需要在调用方法执行中出现异常后，又不需要其它服务器继续调用，
 *        则需在将调用方法的所有异常捕获并自行处理，即视为执行成功。
 *
 * <p>注：当前支持的调度作业的场景为，同一触发时间周期触发调用，
 *        所有服务器会对这次调用的成功状态进行观察，如未执行成功，则所有服务器都会参与，
 *        直到其中一个服务器执行成功或全部失败；
 *
 * <p>    如果调用执行方法处理时间很长，而下一次周期时间又触发了，
 *        则下一次周期时间的触发会失效，直到上一次完成后，周期触发机制才会恢复；
 *        如：作业周期为 0 * 1 1 1 ? 2017，指在2017-01-01 1点每分钟触发一次，
 *        在 2017-01-01 01:01:00 触发了执行，而方法执行超时了，执行了2分半的时间才成功，
 *        则 2017-01-01 01:02:00，2017-01-01 01:03:00 都不会再触发，
 *        直到2017-01-01 01:04:00 会再次触发。
 *
 * <p>    此设计的目的是为了减少作业执行隔离策略的复杂程度，
 *        上述情况可以拆分成单次作业，或异步执行方法，或简化业务模型来实现。
 *        目前为设计的时间精确度保留到分。
 *
 * @author <a href="drakelee1221@gmail.com">LiGeng</a>
 * @version 1.0.0, 2017-08-03 15:01
 *
 */
public abstract class BaseTaskHandler extends NonBlockingUniqueLockTaskHandler {
    /**
     * 设置作业执行结果
     * @param resultMessage
     */
    @Override
    protected final void setResultMessage(String resultMessage){
        super.setResultMessage(resultMessage);
    }

    /**
     * 追加作业执行结果
     * @param resultMessage
     */
    @Override
    protected final void addResultMessage(String resultMessage){
        super.addResultMessage(resultMessage);
    }
    /**
     * 得到作业执行结果
     */
    @Override
    protected final String getResultMessage() {
        return super.getResultMessage();
    }
    /**
     * 得到作业上下文
     */
    @Override
    protected final JobExecutionContext getJobExecutionContext(){
        return super.getJobExecutionContext();
    }

    /**
     * 得到 Spring IOC容器中的 Bean
     * @param clazz
     * @param <T>
     * @return
     */
    @Override
    protected final <T> T getBean(Class<T> clazz){
        return super.getBean(clazz);
    }


    /**
     * 作业执行方法
     * @param argMap 作业持久化记录中的 arguments_map 传递过来的参数
     */
    @Override
    protected abstract void execute(Map<String, Object> argMap);
}
